package com.gujiayue.common.utils;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

import com.google.common.collect.Lists;
import com.gujiayue.common.restful.FieldsNote;

import io.swagger.annotations.ApiModelProperty;

/**
 * 核心公用方法
 * 
 * @author 古佳月
 */
public class CoreUtils {

	private static CoreUtils instance;

	/** *多线程安全单例模式   */
	public static CoreUtils getInstance() {
		if (instance == null) {
			// 对获取实例的方法进行同步
			synchronized (CoreUtils.class) {
				if (instance == null) {
					instance = new CoreUtils();
				}
			}
		}
		return instance;
	}

	/**
	 * 获取累中的所有属性名称及注解内容
	 */
	public List<FieldsNote> getFieldsNote(Object obj) {
		if(StringUtils.isEmpty(obj)) {
			return null;
		}
		// 返回的字段注释
		List<FieldsNote> noteList = Lists.newArrayList();
		// 将子类与父类的字段放到一起
		List<Field> fieldList = Lists.newArrayList();
		// 获取类名
		Class<?> tempClass = obj.getClass();
		while (tempClass != null) {
			// 当父类为null的时候说明到达了最上层的父类(Object类).
			fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
			// 得到父类,然后赋给自己
			tempClass = tempClass.getSuperclass();
		}
		// 循环获取字段
		for (Field field : fieldList) {
			// 是否存在 Swagger字段注释
			boolean boolField = field.isAnnotationPresent(ApiModelProperty.class);
			if (boolField) {
				// 获取注解中文注释
				String note = field.getAnnotation(ApiModelProperty.class).value();
				// 获取注解中文注释描述
				String reason = field.getAnnotation(ApiModelProperty.class).notes();
				// 拼接字段描述
				if (StringUtils.isNotBlank(reason)) {
					note = note + " 描述：" + reason;
				}
				noteList.add(new FieldsNote(field.getName(), note));
			}
		}
		return noteList;
	}
}
